package com.hhs.storage.bean;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.google.common.base.CaseFormat;
import com.hhs.storage.util.NumberUtil;
import com.hhs.storage.util.StringUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
import org.springframework.format.annotation.DateTimeFormat;
import springfox.documentation.annotations.ApiIgnore;

import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

/**
 * @Auther: shadow
 * @Date: 2018/10/10 17:05
 * @Description:
 */

@Data
@ToString
public class InputParam {
    AntdData data=new AntdData();
    String topdep="a3312rraq1top";
    String schoolId;
    Boolean isSelfDir=false;
    String curUserId;//当前请求发起人的用户id,获取自jwt
    String remark;
    String id;
    String pptId;
    Integer cost;
    Integer page=1;
    Integer size=10;
    Integer offset=0;
    Integer status;//订单状态
    Integer statusJunior;//订单状态
    String content;
    String name;
    String flag;
    String account;
    String carFleetId;//车队id
    String carFleetName;//车队名称
    String carFleetType;//车队类型
    String principalName;//负责人名称
    String project;//项目
    String month;//月份
    String licencePlate;//车牌
    String relateType;//关系类型
    Integer personType;//用于考勤设置页面
    String path;
    //权限点的查询有用到
    Integer type;
    String contractType;//合同类型
    String mainId;
    Boolean isFinished = false;//流程flow 是否结束的标识
    Integer flowId; // 流程id
    Integer flowNextStatus;// 流程下一个状态
    Integer queryType;//查询类型 ：1 合同初审  2 合同终审
    String dataType;//查询类型 ：all=全部项目  my=个人项目

    String dateStr;
    //被忽略的用户id
    String[] ignorUserIds;
    String includeIds;
    //星级
    String[] levels;
    //学校文件相关
    String loginSchoolId;
    List<String> LoginClazzIds=new ArrayList<>();
    List<String> LoginWorkIds=new ArrayList<>();
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate signStartTime;//签约开始时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate signEndTime;//签约结束时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endStartTime;//截止开始时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endEndTime;//截止结束时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate createTimeStartTime;//截止开始时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate createTimeEndTime;//截止结束时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate completeTimeStartDate;//完成时间开始日期
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate completeTimeEndDate;//完成时间结束日期
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;//开始时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate goDate;//直接输入时间
    @JSONField(format="yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;//结束时间
    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    private String userId;
    private String userName;
    private String orderBy;//排序字段
    private Boolean asc=true;//是否升序
    public Integer getOffset(){
        return (this.page-1)*this.size;
    }
    private Boolean projectAboutOnly=false;//是否只查询与当前项目相关
    private String permission;//权限名
    private Integer dayOfXx;    //一个星期或一个月中的第几天
    private List<String> idsList=new ArrayList<>();
    private List<String> roleIds=new ArrayList<>();
    private String targetId;
    private String ids;
    private List<PermissionItem> permissionData=new ArrayList<>();
    public void mapParams(String ...props){
        if(!StringUtil.iszNull(data.get("current"))&&!StringUtil.iszNull(data.get("pageSize"))){
            this.page= NumberUtil.toIntCase(data.get("current")+"");
            this.size=NumberUtil.toIntCase(data.get("pageSize")+"");
        }
        for(String prop:props){
            try {
                Field f=this.getClass().getDeclaredField(prop);
                f.setAccessible(true);
                f.set(this,StringUtil.zNull(((Map)data.get("params")).get(prop)));
            } catch (Exception e) {
                //do nothing
            }
        }
        Map sortM=(Map)data.get("sort");
        Iterator it=sortM.entrySet().iterator();
        if(it.hasNext()){
            Map.Entry e=(Map.Entry)it.next();
            String key=e.getKey().toString();
            String value=e.getValue().toString();
            //驼峰转下线
            this.orderBy=CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE,key)+"_";
            if("ascend".equalsIgnoreCase(value)){
                this.asc=true;
            }else if("descend".equalsIgnoreCase(value)){
                this.asc=false;
            }
        }
    }

    /**
     * 映射排序没有_
     * @param props
     */
    public void mapParamsNoTail(String ...props){
        if(!StringUtil.iszNull(data.get("current"))&&!StringUtil.iszNull(data.get("pageSize"))){
            this.page= NumberUtil.toIntCase(data.get("current")+"");
            this.size=NumberUtil.toIntCase(data.get("pageSize")+"");
        }
        for(String prop:props){
            try {
                Field f=this.getClass().getDeclaredField(prop);
                f.setAccessible(true);
                f.set(this,StringUtil.zNull(((Map)data.get("params")).get(prop)));
            } catch (Exception e) {
                //do nothing
            }
        }
        Map sortM=(Map)data.get("sort");
        Iterator it=sortM.entrySet().iterator();
        if(it.hasNext()){
            Map.Entry e=(Map.Entry)it.next();
            String key=e.getKey().toString();
            String value=e.getValue().toString();
            //驼峰转下线
            this.orderBy=CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE,key);
            if("ascend".equalsIgnoreCase(value)){
                this.asc=true;
            }else if("descend".equalsIgnoreCase(value)){
                this.asc=false;
            }
        }
    }
}
